//***************************************************************************************

//                                           主函数
//          总共实现了亚像素的边缘、直线、角点、斑点、圆弧检测以及模板、特征、形状匹配八个功能
//                              按任意键退出，按键1～8分别为实现上述8种功能

//***************************************************************************************

#include "ImageDecMat.hpp"


void ShowHelpText()
{
    
    //说明文字,帮助文档
    printf("\n\n------------------------------------------------------------------\n");
    printf("\n\n\t\t\t总共实现了亚像素的边缘、直线、角点、斑点、圆弧检测以及模板、特征、形状匹配八个功能。\n");
    printf("\n\n\t\t\t按任意键退出，按键1～8分别为实现上述8种功能\n");
    printf("\n\n\t\t\t按键1，利用canny算子实现边缘检测-其中canny边缘低阈值为100，高阈值为200");
    printf("\n\n\t\t\t按键2，利用累积概率霍夫变换实现亚像素直线-其中canny边缘低阈值为50，高阈值为200，累积平面阈值为80");
    printf("\n\n\t\t\t按键3，利用Shi-Tomasi算法实现亚像素角点检测-其中角点最大数量为150");
    printf("\n\n\t\t\t按键4，利用Blob分析实现亚像素斑点检测-其中检测最小区域为100，最大区域为8000");
    printf("\n\n\t\t\t按键5，利用霍夫圆变换实现亚像素圆弧检测-canny高阈值为200，圆心累加阈值为110");
    printf("\n\n\t\t\t按键6，实现模板匹配-0代表平方差匹配法，1代表归一化平方差匹配法，2代表相关匹配法，3代表归一化相关匹配法，4代表系数匹配法，5代表归一化系数匹配法，本例子使用的方法5");
    printf("\n\n\t\t\t按键7，利用ORB算法提取特征并利用FLANN进行匹配 实现特征匹配");
    printf("\n\n\t\t\t按键8，利用轮廓信息实现形状匹配-其中canny边缘低阈值为100，高阈值为200，且对轮廓图使用模板匹配方法也是5:归一化系数匹配法");
    printf("\n\n------------------------------------------------------------------\n");
    
}

int main()
{
    //显示帮助说明文字
    ShowHelpText();
    ImageDecMat process;
    cv::Mat srcImage,templateImage,dstImage;
    //载入源图像srcImage
    srcImage=cv::imread("/Users/new/Desktop/3.jpg");
    if(!srcImage.data){printf("读取源图像srcImage错误～！\n");return false;}
    //载入模板图片templaImage
    templateImage=cv::imread("/Users/new/Desktop/4.jpg");
    if(!templateImage.data){printf("读取模板图像templateImage错误～！\n");return false;}
    //创建窗口以及滚动条
    imshow("image[origin]",srcImage);//显示源图像
    
    
    //***********************参数定义************************************
    int key=cvWaitKey(0);//获取键盘按键
    //根据按键的不同，进行各种操作，按键为1～7
    switch((char)key)
    {
        case '1'://按'1'，进行边缘检测
            std::cout<<"按键'1'被按下，进行亚像素边缘检测操作\n";
            process.Image_DetectMatch(srcImage, templateImage, 1, dstImage);
            std::cout<<"请按任意键退出\n";
            break;
        case '2'://按'2'，进行直线检测
            std::cout<<"按键'2'被按下，进行亚像素直线检测操作\n";
            process.Image_DetectMatch(srcImage, templateImage, 2, dstImage);
            std::cout<<"请按任意键退出\n";
            break;
        case '3'://按'3'，进行角点检测
            std::cout<<"按键'3'被按下，进行亚像素角点检测操作\n";
           process.Image_DetectMatch(srcImage, templateImage, 3, dstImage);
            std::cout<<"请按任意键退出\n";
            break;
        case '4'://按'4'，进行斑点检测
            std::cout<<"按键'4'被按下，进行亚像素斑点检测操作\n";
            process.Image_DetectMatch(srcImage, templateImage, 4, dstImage);
            std::cout<<"请按任意键退出\n";
            break;
        case '5'://按'5'，进行圆弧检测
            std::cout<<"按键'5'被按下，进行亚像素圆弧检测操作\n";
            process.Image_DetectMatch(srcImage, templateImage, 5, dstImage);
            std::cout<<"请按任意键退出\n";
            break;
        case '6'://按'6'，进行模板匹配操作
            std::cout<<"按键'6'被按下，进行模板匹配操作\n";
            process.Image_DetectMatch(srcImage, templateImage, 6, dstImage);
            std::cout<<"请按任意键退出\n";
            break;
        case '7'://按'7'，进行特征匹配操作
            std::cout<<"按键'7'被按下，进行特征匹配操作\n";
            process.Image_DetectMatch(srcImage, templateImage, 7, dstImage);
            std::cout<<"请按任意键退出\n";
            break;
        case '8'://按'8'，进行形状匹配操作
            std::cout<<"按键'8'被按下，进行形状匹配操作\n";
            process.Image_DetectMatch(srcImage, templateImage, 8, dstImage);
            std::cout<<"请按任意键退出\n";
            break;
        default:
            std::cout<<"请按ESC退出，或者按下 数字1～8进行相应操作\n";
    }
    cvWaitKey(0);
    return 0;
    
    
}
